1
ข้ามข้อผิดพลาดของค่า NULL
AI013Lesson 2
00:00

การเปลี่ยนจากแมโครแบบซีไปสู่ตัวเลขชนิดปลอดภัยในซีพลัส แสดงถึงการเปลี่ยนแปลงเชิงพื้นฐานด้านความสะดวกในการใช้งานภาษา ซึ่งช่วยแก้ไขปัญหา "ข้อผิดพลาดของค่า NULL" ซึ่งความคลุมเครือของแมโครค่าศูนย์ทำให้เกิดข้อผิดพลาดทางตรรกะโดยไม่มีเสียงเตือน

1. การล้มเหลวของการเลือกฟังก์ชันที่มีการโอเวอร์โหลด

ในมาตรฐานเก่า (ซีพลัส98) NULL มักจะถูกกำหนดเป็น 0. เมื่อถูกส่งไปยังฟังก์ชันที่มีการโอเวอร์โหลด คอมไพเลอร์จะตีความว่า NULL เป็นจำนวนเต็ม ซึ่งสามารถเห็นได้จาก:

if (std::is_same<decltype(NULL), decltype(0)>::value)
std::cout << "NULL เป็นจำนวนเต็ม";

2. แนวทางแก้ไขด้วยคำสั่ง nullptr

ซีพลัส11 ได้นำเสนอ nullptr, คำสั่งที่มีประเภท std::nullptr_t. แตกต่างจากแมโคร ไม่สามารถแปลงแบบแฝงไปเป็นชนิดจำนวนเต็ม (ยกเว้น bool) จึงทำให้แน่ใจได้ว่าจะเลือกฟังก์ชันเฉพาะสำหรับตัวชี้เท่านั้น

ข้อผิดพลาดแบบเดิมfoo(NULL)เรียกใช้ฟังก์ชัน foo(int)การแก้ไขแบบทันสมัยfoo(nullptr)เรียกใช้ฟังก์ชัน foo(char*)

3. การเชื่อมโยงและการทำงานร่วมกัน

ซีพลัสสมัยใหม่ต้องการ extern "C" เพื่อป้องกันการเปลี่ยนชื่อเมื่อเชื่อมกับโค้ดซี (เช่น คอมไพล์ด้วย gcc). การคงความปลอดภัยด้านชนิดของตัวชี้ที่ขอบเขตดังกล่าวมีความสำคัญมาก

$$\text{std::nullptr\_t} \neq \text{int}$$

main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>